package pruebasIntegracion;

import juego.Juego;
import junit.framework.TestCase;
import tablero.Posicion;
import tablero.Tablero;
import titiritero.vista.VistaBuqueHorizontal;
import titiritero.vista.VistaDestructorHorizontal;
import titiritero.vista.VistaDestructorVertical;
import titiritero.vista.VistaLanchaHorizontal;
import titiritero.vista.VistaLanchaVertical;
import titiritero.vista.VistaPortaavionesVertical;
import titiritero.vista.VistaRompehielosHorizontal;
import ataques.Disparo;
import ataques.MinaContacto;
import ataques.MinaDoble;
import ataques.MinaTriple;
import barco.Buque;
import barco.Destructor;
import barco.Direccion;
import barco.Lancha;
import barco.Portaaviones;
import barco.Rompehielos;

public class JuegoCompletoTest extends TestCase {

    Juego juego;

    public void setUp() {
        juego = new Juego();
        Tablero tablero = juego.getTablero();
        Lancha lancha1 = new Lancha(Direccion.ABAJO);
        tablero.colocarBarcoHorizontal(new Posicion(1, 1), lancha1);
        tablero.addVista(new VistaLanchaHorizontal(lancha1));

        Lancha lancha2 = new Lancha(Direccion.ABAJODERECHA);
        tablero.colocarBarcoVertical(new Posicion(7, 4), lancha2);
        tablero.addVista(new VistaLanchaVertical(lancha2));

        Destructor destructor1 = new Destructor(Direccion.IZQUIERDA);
        tablero.colocarBarcoHorizontal(new Posicion(10, 5), destructor1);
        tablero.addVista(new VistaDestructorHorizontal(destructor1));

        Destructor destructor2 = new Destructor(Direccion.ARRIBADERECHA);
        tablero.colocarBarcoVertical(new Posicion(5, 5), destructor2);
        tablero.addVista(new VistaDestructorVertical(destructor2));

        Buque buque = new Buque(Direccion.DERECHA);
        tablero.colocarBarcoHorizontal(new Posicion(4, 3), buque);
        tablero.addVista(new VistaBuqueHorizontal(buque));

        Portaaviones portaaviones = new Portaaviones(Direccion.ARRIBA);
        tablero.colocarBarcoVertical(new Posicion(3, 9), portaaviones);
        tablero.addVista(new VistaPortaavionesVertical(portaaviones));

        Rompehielos rompehielos = new Rompehielos(Direccion.ABAJOIZQUIERDA);
        tablero.colocarBarcoHorizontal(new Posicion(5, 6), rompehielos);
        tablero.addVista(new VistaRompehielosHorizontal(rompehielos));
    }

    public void testJuegoCompletoDeberiaGanar() {
        int puntos = 10000;
        int puntosTurno = 10;
        int costoDisparo = 200;
        int costoMinaTriple = 125;
        int costoMinaDoble = 100;
        juego.lanzarAtaque(new MinaTriple(new Posicion(4, 7)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoMinaTriple);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaDoble(new Posicion(8, 3)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoMinaDoble);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 3)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaTriple(new Posicion(8, 3)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoMinaTriple);
        assertEquals(juego.getPuntos(), puntos);
        assertEquals(juego.cantidadBarcos(), 5);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 2)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        assertEquals(juego.cantidadBarcos(), 4);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 4)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        assertEquals(juego.cantidadBarcos(), 3);
        juego.lanzarAtaque(new Disparo(new Posicion(3, 7)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        assertEquals(juego.cantidadBarcos(), 1);
        juego.lanzarAtaque(new Disparo(new Posicion(5, 6)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(7, 5)));
        juego.pasarTurno();
        puntos -= (puntosTurno + costoDisparo);
        assertEquals(juego.getPuntos(), puntos);
        assertEquals(juego.juegoGanado(), true);
    }

    public void testJuegoCompletoDeberiaPerder() {
        int puntos = 10000;
        int puntosTurno = 10;
        int costoDisparo = 200;
        int costoMinaTriple = 125;
        int costoMinaDoble = 100;
        int costoMinaContacto = 150;

        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(8, 4)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 7);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(8, 5)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 6);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaTriple(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoMinaTriple;
        assertEquals(juego.cantidadBarcos(), 6);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaDoble(new Posicion(4, 8)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoMinaDoble;
        assertEquals(juego.cantidadBarcos(), 6);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaContacto(new Posicion(6, 9)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoMinaContacto;
        assertEquals(juego.cantidadBarcos(), 6);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(1, 1)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 6);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(1, 1)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 5);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 5);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 5);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaContacto(new Posicion(8, 1)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoMinaContacto;
        assertEquals(juego.cantidadBarcos(), 5);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new MinaContacto(new Posicion(8, 2)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoMinaContacto;
        assertEquals(juego.cantidadBarcos(), 5);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        juego.lanzarAtaque(new Disparo(new Posicion(10, 10)));
        juego.pasarTurno();
        puntos = puntos - puntosTurno - costoDisparo;
        assertEquals(juego.cantidadBarcos(), 4);
        assertEquals(juego.getPuntos(), puntos);
        assertTrue(juego.getPuntos() < 5000);
        assertEquals(juego.juegoGanado(), false);
    }

}
